package com.test.springboot_test.test04_sa_token.controller;

import cn.dev33.satoken.annotation.*;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Slf4j
@RequestMapping("/user")
public class Sa_tokenController {


    // 登录校验：只有登录之后才能进入该方法
    @SaCheckLogin
    @RequestMapping("/info")
    public String info() {
        System.out.println("用户信息："+StpUtil.getLoginId());
        System.out.println("获取 token："+StpUtil.getTokenInfo());
        return "查询用户信息";
    }

    // 角色校验：必须具有指定角色才能进入该方法
    @SaCheckRole("super-admin")
    @RequestMapping("add")
    public String add1() {
        boolean b = StpUtil.hasRole("super-admin");
        System.out.println("登陆的用户是否用户超级管理员的权限："+b);
        return "用户增加";
    }

    // 权限校验：必须具有指定权限才能进入该方法
    @SaCheckPermission("order.add")
    @RequestMapping("add2")
    public String add2() {
        return "用户增加";
    }

//    // 二级认证校验：必须二级认证之后才能进入该方法
//    @SaCheckSafe()
//    @RequestMapping("add")
//    public String add3() {
//        return "用户增加";
//    }
//
//    // Http Basic 校验：只有通过 Http Basic 认证后才能进入该方法
//    @SaCheckHttpBasic(account = "sa:123456")
//    @RequestMapping("add")
//    public String add4() {
//        return "用户增加";
//    }
//
//    // Http Digest 校验：只有通过 Http Digest 认证后才能进入该方法
//    @SaCheckHttpDigest(value = "sa:123456")
//    @RequestMapping("add")
//    public String add5() {
//        return "用户增加";
//    }
//
//    // 校验当前账号是否被封禁 comment 服务，如果已被封禁会抛出异常，无法进入方法
//    @SaCheckDisable("comment")
//    @RequestMapping("send")
//    public String send() {
//        return "查询用户信息";
//    }

    // 注解式鉴权：只要具有其中一个权限即可通过校验   OR (如果是AND就要全部满足)
    @RequestMapping("atJurOr")
    @SaCheckPermission(value = {"order.add", "order.all", "order.delete"}, mode = SaMode.OR)
    public SaResult atJurOr() {
        return SaResult.data("用户信息");
    }

    // 角色权限双重 “or校验”：具备指定权限或者指定角色即可通过校验
    @RequestMapping("userAdd")
    @SaCheckPermission(value = "user.add", orRole = "admin")
    public SaResult userAdd() {
        return SaResult.data("用户信息");
    }

    // ... 其它方法

    // 此接口加上了 @SaIgnore 可以游客访问
    @SaIgnore
    @RequestMapping("getList")
    public SaResult getList() {
        // ...
        return SaResult.ok();
    }

    // 在 `@SaCheckOr` 中可以指定多个注解，只要当前会话满足其中一个注解即可通过验证，进入方法。
    @SaCheckOr(
            login = @SaCheckLogin,
            role = @SaCheckRole("admin"),
            permission = @SaCheckPermission("user.add"),
            safe = @SaCheckSafe("update-password"),
            httpBasic = @SaCheckHttpBasic(account = "sa:123456"),
            disable = @SaCheckDisable("submit-orders")
    )
    @RequestMapping("test")
    public SaResult test() {
        // ...
        return SaResult.ok();
    }


}
